<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
<script>
	// * 基本使用
	// >  与对象解构的语法相比，数组解构就简单多了，它使用的是数组字面量，且解构操作全部在数组内完成，
	// 而不是像对象字面量语法一样使用对象的命名属性 。
	// {
	// 	const arr = [1,2,3,4,5,6];
	// 	const [a,b,c,suibian,la,xi] = arr;
	// 	console.log(a,b,c,suibian,la,xi);
	// }
	// * 忽略元素
	// > 在解构模式中，可以直接省略元素，只为感兴趣的元素提供变量名 。
	{
		// const [,,,,b,c] = [1,2,3,4,5,6];
		// console.log(b,c);// 5 6
	}
	// *  赋值上下文 :对之前定义的变量进行修改（重置）操作。
	// > 数组解构也可用于赋值上下文
	{
		// let username = "zhangsan";
		// let age = 12;
		// // 数组
		// // [username, age] = ["lisi", 200];
		// // 对象
		// ({username,age}= {username:"wangwu",age:100});
		// console.log(username, age);// wangwu 100
	}
	// * 变量交换
	// > 数组解构语法还有一个独特的用例：交换两个变量的值。在排序算法中，
	//    值交换是一个非常常见的操作，如果要在`ES5`中交换两个变量的值，则须引入第三个临时变量
	{
		// let a = "zhang";
		// let b = "wang";
		// [b,a]= [a,b];
		// console.log(a,b);// wang zhang
	}
	// *  默认值
	// > 也可以在数组解构赋值表达式中为数组中的任意位置添加默认值，当指定位置的属性不存在或其值为undefined时使用默认值
	// {
	// 	const [a,b,c,d=100] = [1,2,3];
	// 	console.log(a,b,c,d);// 1 2 3 undefined
    // }

	// *  嵌套数组解构
	// >  嵌套数组解构与嵌套对象解构的语法类似，在原有的数组模式中插入另一个数组模式，即可将解构过程深入到下一个层级
	// {
	// 	// const [a,b,c] = [1,2,[3,4,5,6,7],8,9,10];
	// 	// console.log(a,b,c);// 1 2 [3,4,5,6,7]
    //
	// 	const [a,b,[c,d,e,f]] = [1,2,[3,4,5,6,7],8,9,10];
	// 	console.log(a,b,c,d,e,f);// 1 2 3 4 5 6
    // }
	// *  不定元素
	// > 函数具有不定参数，而在数组解构语法中有一个相似的概念——不定元素。在数组中，可以通过...语法将数组中的其余元素赋值给一个特定的变量
	// {
	// 	function fn(...arr){
	// 		// 1
    //         // let sum = 0;
    //         // for(let i=0;i<arr.length;i++){
	// 		// 	sum += arr[i];
    //         // }
	// 		// return sum;
    //
    //         // 2 [1,2]
    //         // let sum = 0;
    //         // arr.forEach(function(item){
	// 		// 	sum += item;
    //         // })
    //         // return sum;
    //
    //         // 3 [1,2]
    //         return arr.reduce(function(m,n){
	// 			// console.log(m,n);// 0 1    1 2
    //             return m+n;// 3
    //         },0)
    //     }
	// 	console.log(fn(1,2));
	// 	console.log(fn(1,2,3));
	// 	console.log(fn(1,2,3,4));
	// 	console.log(fn(1,2,3,4,5));
    // }
	// *  数组复制
	// > 在`ES5`中，开发者们经常使用`concat()`方法来克隆数组
	{
		// 深复制 浅复制
        let arr = [1,2,3,4];// 1,2,3,4
		// let arr2 = arr.concat([100,200]);// concat可以将接收到的数组进行合并
		// console.log(arr === arr2,arr,arr2)

        let arr2 = [...arr,100,200];
		console.log(arr===arr2,arr,arr2)

        let obj = {
			a:1,
            b:2
        }
		const obj2 = {...obj};
		console.log(obj===obj2,obj,obj2)
    }
</script>
</html>